{
 "cells": [
  {
   "cell_type": "markdown",
   "source": [
    "# 图像分类任务"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "482e36e3134304fd"
  },
  {
   "cell_type": "markdown",
   "source": [
    "# 卷积神经网络(CNN)——MNIST"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "ba58b17aa1d89712"
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 数据准备与预处理"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "417358e1dff5924"
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2025-06-10T10:29:02.789625Z",
     "start_time": "2025-06-10T10:29:02.783777Z"
    }
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.optim as optim\n",
    "import torchvision\n",
    "import torchvision.transforms as transforms\n",
    "import os\n",
    "import numpy as np\n",
    "import time\n",
    "from sklearn.metrics import accuracy_score, precision_recall_fscore_support, confusion_matrix, classification_report\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns"
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "## 调用Pytorch库实现CNN模型的训练与评估"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "e50c0ad858c60c59"
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 9.91M/9.91M [00:03<00:00, 2.84MB/s]\n",
      "100%|██████████| 28.9k/28.9k [00:00<00:00, 110kB/s]\n",
      "100%|██████████| 1.65M/1.65M [00:01<00:00, 1.10MB/s]\n",
      "100%|██████████| 4.54k/4.54k [00:00<00:00, 4.54MB/s]\n"
     ]
    }
   ],
   "source": [
    "# 数据集路径\n",
    "data_dir = r'D:\\Machine_learning\\jiqixuexi\\mnist\\mnist\\MNIST\\raw'\n",
    "# 定义device变量，优先使用GPU\n",
    "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
    "# 加载MNIST数据集\n",
    "transform = transforms.Compose([\n",
    "    transforms.ToTensor(),\n",
    "    transforms.Normalize((0.5,), (0.5,))  # 对于灰度图像，均值和标准差为0.5\n",
    "])\n",
    "# 使用torchvision.datasets.MNIST加载数据集\n",
    "train_dataset = torchvision.datasets.MNIST(root=data_dir, train=True, download=True, transform=transform)\n",
    "test_dataset = torchvision.datasets.MNIST(root=data_dir, train=False, download=True, transform=transform)\n",
    "\n",
    "# 数据加载器\n",
    "train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True, num_workers=2)\n",
    "test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False, num_workers=2)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-06-10T10:38:10.295669Z",
     "start_time": "2025-06-10T10:37:55.720752Z"
    }
   },
   "id": "871163f5eaae51a9",
   "execution_count": 7
  },
  {
   "cell_type": "markdown",
   "source": [
    "### 模型训练与评估"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "673447bfa746712e"
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch [1/10], Loss: 0.1845\n",
      "Epoch [2/10], Loss: 0.0589\n",
      "Epoch [3/10], Loss: 0.0438\n",
      "Epoch [4/10], Loss: 0.0350\n",
      "Epoch [5/10], Loss: 0.0285\n",
      "Epoch [6/10], Loss: 0.0248\n",
      "Epoch [7/10], Loss: 0.0196\n",
      "Epoch [8/10], Loss: 0.0180\n",
      "Epoch [9/10], Loss: 0.0169\n",
      "Epoch [10/10], Loss: 0.0135\n",
      "训练时间: 149.64秒\n",
      "测试准确率: 0.9936\n"
     ]
    }
   ],
   "source": [
    "# 定义CNN模型\n",
    "class CNN(nn.Module):\n",
    "    def __init__(self):\n",
    "        super(CNN, self).__init__()\n",
    "        self.conv1 = nn.Conv2d(1, 32, 3, padding=1)\n",
    "        self.conv2 = nn.Conv2d(32, 64, 3, padding=1)\n",
    "        self.pool = nn.MaxPool2d(2, 2)\n",
    "        self.dropout = nn.Dropout(0.5)\n",
    "        self.fc1 = nn.Linear(64 * 7 * 7, 512)\n",
    "        self.fc2 = nn.Linear(512, 10)\n",
    "\n",
    "    def forward(self, x):\n",
    "        x = self.pool(torch.relu(self.conv1(x)))\n",
    "        x = self.pool(torch.relu(self.conv2(x)))\n",
    "        x = x.view(-1, 64 * 7 * 7)\n",
    "        x = torch.relu(self.fc1(x))\n",
    "        x = self.dropout(x)\n",
    "        x = self.fc2(x)\n",
    "        return x\n",
    "\n",
    "# 初始化模型、损失函数和优化器，并将模型移动到device\n",
    "model = CNN().to(device)\n",
    "criterion = nn.CrossEntropyLoss()\n",
    "optimizer = optim.Adam(model.parameters(), lr=0.001)\n",
    "\n",
    "# 训练模型\n",
    "start_time = time.time()\n",
    "num_epochs = 10\n",
    "for epoch in range(num_epochs):\n",
    "    model.train()\n",
    "    epoch_loss = 0.0\n",
    "    for i, (images, labels) in enumerate(train_loader):\n",
    "        images = images.to(device)\n",
    "        labels = labels.to(device)\n",
    "        optimizer.zero_grad()\n",
    "        outputs = model(images)\n",
    "        loss = criterion(outputs, labels)\n",
    "        epoch_loss += loss.item()\n",
    "        loss.backward()\n",
    "        optimizer.step()\n",
    "    print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {epoch_loss / len(train_loader):.4f}')\n",
    "\n",
    "train_time = time.time() - start_time\n",
    "print(f\"训练时间: {train_time:.2f}秒\")\n",
    "\n",
    "# 测试模型\n",
    "model.eval()\n",
    "with torch.no_grad():\n",
    "    correct = 0\n",
    "    total = 0\n",
    "    all_labels = []\n",
    "    all_preds = []\n",
    "    for images, labels in test_loader:\n",
    "        images = images.to(device)\n",
    "        labels = labels.to(device)\n",
    "        outputs = model(images)\n",
    "        predicted = torch.max(outputs.data, 1)\n",
    "        total += labels.size(0)\n",
    "        correct += (predicted == labels).sum().item()\n",
    "        all_labels.extend(labels.cpu().numpy())\n",
    "        all_preds.extend(predicted.cpu().numpy())\n",
    "    test_acc = correct / total\n",
    "    print(f\"测试准确率: {test_acc:.4f}\")"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-06-10T10:46:34.898808Z",
     "start_time": "2025-06-10T10:43:56.730796Z"
    }
   },
   "id": "4bcdf34ade77f874",
   "execution_count": 8
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Accuracy: 0.9936\n",
      "Precision: 0.9936128790681702\n",
      "Recall: 0.9936\n",
      "F1-score: 0.9936009463379518\n",
      "Confusion Matrix:\n",
      " [[ 976    0    1    0    0    0    1    0    1    1]\n",
      " [   0 1130    0    1    1    1    1    1    0    0]\n",
      " [   1    0 1021    1    2    0    1    5    1    0]\n",
      " [   0    0    0 1008    0    1    0    0    1    0]\n",
      " [   0    0    0    0  978    0    0    0    0    4]\n",
      " [   1    0    0    5    0  885    1    0    0    0]\n",
      " [   2    2    0    0    1    1  951    0    1    0]\n",
      " [   0    0    1    1    2    0    0 1018    1    5]\n",
      " [   0    0    1    2    1    0    0    0  969    1]\n",
      " [   0    0    0    0    5    3    0    1    0 1000]]\n",
      "Classification Report:\n",
      "               precision    recall  f1-score   support\n",
      "\n",
      "           0       1.00      1.00      1.00       980\n",
      "           1       1.00      1.00      1.00      1135\n",
      "           2       1.00      0.99      0.99      1032\n",
      "           3       0.99      1.00      0.99      1010\n",
      "           4       0.99      1.00      0.99       982\n",
      "           5       0.99      0.99      0.99       892\n",
      "           6       1.00      0.99      0.99       958\n",
      "           7       0.99      0.99      0.99      1028\n",
      "           8       0.99      0.99      0.99       974\n",
      "           9       0.99      0.99      0.99      1009\n",
      "\n",
      "    accuracy                           0.99     10000\n",
      "   macro avg       0.99      0.99      0.99     10000\n",
      "weighted avg       0.99      0.99      0.99     10000\n"
     ]
    }
   ],
   "source": [
    "# 计算评估指标\n",
    "accuracy = accuracy_score(all_labels, all_preds)\n",
    "precision, recall, f1, _ = precision_recall_fscore_support(all_labels, all_preds, average='weighted')\n",
    "conf_matrix = confusion_matrix(all_labels, all_preds)\n",
    "class_report = classification_report(all_labels, all_preds)\n",
    "\n",
    "# 输出结果\n",
    "print(\"Accuracy:\", accuracy)\n",
    "print(\"Precision:\", precision)\n",
    "print(\"Recall:\", recall)\n",
    "print(\"F1-score:\", f1)\n",
    "print(\"Confusion Matrix:\\n\", conf_matrix)\n",
    "print(\"Classification Report:\\n\", class_report)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-06-10T12:57:18.152852Z",
     "start_time": "2025-06-10T12:57:18.010996Z"
    }
   },
   "id": "2a1be192bc3fcbc5",
   "execution_count": 9
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 1000x800 with 2 Axes>",
      "image/png": "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9Pzzz2vnzp0O277xxhu66667NH36dHXr1k1fffXVDZ/3nwoUKKB69epd82v+unXrdMcdd6hy5coOyw8dOqQuXbrI399fkydP1owZM1S9enVNmzZN33zzjSRlvibt27d3eH1OnTqlDRs2aNKkSerfv78CAgIcnvvVV1/VvffeqzfeeEPJyck6c+aM3nnnHTVp0uSaYU3/tGLFCj388MPy9fW9Zl3Tpk2Vlpamb7/91mH56tWrr1swXZXd929gYKCqVKmiuXPnaujQodq4cWNmF8jb21u9evVSxYoVb/n5/qlatWoqVqyYVq1ala3HA8DtiqICyGUuXLigy5cvZ2sOgLe3t8aNG6cLFy7onXfeyfHts+qvv/6SpFvO5ejRo1qyZIn69eunAQMGqF69eurevbveeustbd26VZs3b87c9tKlS5o5c6ZatGihRo0aafjw4UpKStL27dsVGBiYOWTmnnvuUdWqVW855p07d6pChQpq166dateure7du2vEiBE3/OV62rRp8vb21oIFC/TYY4/p0Ucf1ccff6y7775b7777rsO2jRo10tChQ1W3bl317NlTtWvX1vfff39LcT322GPatWuXoqKiMpd988031/2j+9ChQ3rwwQf17rvvqn79+mrQoIEmTJig/PnzKzw8XJIyX5PixYs7vD6pqakaOnSo6tWrp8cff/ya586TJ4/Gjx+vyMhIffTRRxo1apR8fX319ttv3zD2uLg47du3T5UqVbru+sKFC6tWrVpau3Zt5rI///xTv/zyy38WFUbev1OmTFGNGjX09ddfq2/fvnrwwQfVsmVLffDBB4qNjc3Sc/2TzWZTxYoVtW3btmw/BwDcjigqgFzm6i/2aWlp2Xp8+fLl1b17d61cufKaX35zYvursaWmpmbebhTr1VyuDrm5mau/7Lds2dJheYsWLeTp6elwdqPAwECHcf7FixeXJCUmJt7Svm6kTp06+umnn9SxY0d98sknioiI0LPPPqvWrVvfMOaHH35Y+fPnz1zm5eWlFi1aaN++fQ7Dm/5d3BQvXlwJCQm3FNejjz4qT0/PzCFQZ8+e1a5du677R3fr1q01e/ZspaSk6MiRI9q4caOmTp2qtLS0zGFc/6Vs2bL/ub5KlSp68cUX9eGHH2rLli0aN27cNR2Nfzp9+rTS0tL+s7hs3ry5tm7dmjkE6ptvvlGFChVUqlSp/4wlO+9f6cpr/+mnn+qbb77R0KFD1ahRI/3555+aPn26mjdvrmPHjt3yc/3bXXfddc2ZpgAgt6OoAHIZf39/5c2bV6dOnbrhNgkJCf853KNPnz4qW7as3njjjVv61TWr23fp0kUVKlTIvHXp0uW6291xxx2y2Wz6888/b/hcFy9ezPzD++q+ixQp4rCNl5eXAgICHMbc/3to2NXhVbdawNxIt27d9PrrryspKUnjx49X8+bN1bJlyxv+8hwbG6vChQtfs7xw4cLKyMhwmPfy75g9PDxu+ToR+fLlU8OGDTOHQK1du1ZlypS5bgGQlJSkkSNHqkaNGmrZsqXGjRunkydPysvL65b2d718/q1169ZKT09XQECAqlSp8p/bXj1ufn5+N9ymSZMmysjIyJwfsWbNmv/sUvxTVt+//1SmTBm98MILmjVrlnbs2KG3335bMTExmjRpUpae55/sdvs180MAILejqAByofr162vHjh0Ok5P/aenSpapbt6727t173fU+Pj4aO3asLly4oNDQ0JvuL6vbv/XWW1qyZEnm7a233rrudoGBgapQoYK2bNlywz9mZ8yYoTp16uj06dMqWLCgpCtzMf4pJSVFFy5c+M9fw2/Vv7sq/+4UeHh4qFOnTlq6dKl+/PFHjR07VpcvX9ZLL7103VO3FixY8LrX2riaQ07EfFXz5s21a9cunT9//j/nG4SGhmrdunV6//33tWfPHm3cuFHvvvuuvLxy5izjGRkZeuONN1SiRAklJydr/Pjx/7n91dfg4sWL/7nNAw88oLVr1+rYsWM6ePCgmjdvfkvxZPX9O3/+fD3wwAPXdLW8vb3VoUMHNWrUSEePHr2lfV/PxYsXc/S4A8DtgKICyIVeeOEFxcTEaPLkydesi4qK0pw5c1SyZMn/nCtQsWJFdevWTcuXL9dvv/12031mZfv77rtPlSpVyrzdd999N9z2xRdf1O+//65PP/30mnV//PGHFi9erNq1a+uOO+5Q7dq1JUkrV6502O6bb75RWlqaatSocdM8/ku+fPky53lctWfPHof7Tz/9dOb4/EKFCqlt27bq1KmTLl26dN0LtNWqVUubNm1y+GU6LS1N33zzjSpVqiQfHx9DMf/Tww8/rDx58ujTTz/Vzz//fMOiYvfu3Zlnb7raHdi/f7+io6MdOjn/PrXrrZo/f7527dql0NBQDRgwQF9++aXDfJd/K1asmDw9Pa957f/t6lmgFi9erJo1a2YOabsVWXn/lilTRhcuXLjuezItLU2RkZE3HQL2X06fPp3j110BALNx8TsgF6patapeeeUVvf/++4qIiFCbNm0UEBCgI0eO6OOPP1Z8fLw++uijG55R6aq+ffvq22+/1ZEjR25pv1nd/lY0b95cP/30k0JDQ/XLL7+oWbNmyps3r/bt26ePP/5YBQoU0NixYyVd+WOvTZs2mjZtmpKSklSnTh0dPHgw8xSnDRo0MBTLww8/rO+++06hoaF69NFHtXv3bn399dcO29SqVUsff/yxChcurGrVqunMmTP65JNPVLt2bQUGBl7T2ejXr582b96s5557Tj169JCPj48WLlyoyMjIHL+6sp+fnxo1aqS5c+eqcuXKN5w8XrlyZa1Zs0aff/65SpcurUOHDmnGjBmy2WwOv84XKFBAe/fuVXh4uGrWrHlLMfzvf//T5MmT9eSTT6pOnTqqVauWVqxYoVGjRmnVqlUqUKDAdeOuXr269uzZc8OhctKVU+e+8cYbmj9/vkaOHHlL8fzTrb5/r05CnzRpkg4fPqymTZsqMDBQf/31lxYtWqS//vpL77//fpb3L13p4uzduzfHr0gPAGajqAByqd69e6t8+fIKCwvT2LFjFRMTo+LFi6thw4bq1auX7rzzzps+x9VhIde7EnNObH+r3nnnHdWpU0dffvml3njjDcXFxemuu+5Su3bt1K1bN4cLyYWGhqpkyZL66quvNHfuXBUtWlSdO3dW3759s/3L+lXt2rXTiRMntGzZMn3xxReqXbu2PvjgAz3zzDOZ27zyyivy8fHRV199pQ8//FD58+dX48aNNXDgwOs+Z1BQkD777DNNmjRJI0aMkM1mU+XKlbVgwYJb/kM9K5o3b661a9f+59CgYcOGKSUlRe+//76Sk5N19913q3fv3jp69Ki+++47paWlydPTU7169dL06dPVvXv3/7xy9VXp6ekaPny48ufPryFDhki60u0YPXq02rZtq9DQ0BsOhWratKmmTp2qy5cvK0+ePNfdpkCBAqpfv762bNmipk2b3sKr4Sgr7993331XderU0fLlyzVq1CglJCQoMDBQ9erV09ixY7N9nYpff/1VMTExatasWbYeDwC3K1vGrc4CBADASRITE/Xoo49q8ODB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FQAAAACs65Y6FeHh4TdcFx0dnWPBAAAAAMh9bqmo6Ny583+up2UEOJ9Vpy5FLepqdgimKP3SMrNDMEXE1DZmhwDAghi6Y9wtFRWHDh1ydhwAAAAAcqkcmagNAAAA5FaMujGObg8AAAAAQygqAAAAABjC8CcAAABYmgejnwzLcqciOTlZGzZs0Lx585SYmMgkbgAAAMDistSpOHHihF544QWlpKTo4sWLatSokdq1a6dp06bp4YcfdlaMAAAAgNPQqTAuS52K0NBQtW3bVt9//728vLx077336p133tGUKVOcFR8AAACA21yWioqff/5Z3bp1k81myzz11hNPPKHIyEinBAcAAAA429W/bc24uYssFRX58+fX+fPnHZadO3dOBQsWzNGgAAAAAOQeWSoqWrZsqX79+unHH39Uenq6fv31Vw0aNEgtWrRwVnwAAAAAbnNZmqjdp08fJSUlqV+/fkpMTFTnzp3Vvn179evXz1nxAQAAAE7FRG3jslRUeHt7a+jQoRo6dKiio6MVEBDgVmPBAAAAAGRdloqKr7/++obrWrdubTAUAAAAwPX4jdy4LBUV/z51bGxsrBITE1WjRg2KCgAAAMCislRUfPfddw73MzIyNHv2bMXExORkTAAAAABykSyd/enfbDabXnzxRS1fvjyn4gEAAABcysNmM+3mLgwVFZL0v//9j8naAAAAgIVlafhT586dHQqIlJQUHT58WK1atcrxwAAAAABXMPwrO7JWVNSpU8fhvoeHh7p06aJHH300R4MCAAAAkHtkqai4cOGCBgwYoHz58jkrHgAAAMClGMlvXJa6PStXrpTdbndWLAAAAAByoSx1Ktq1a6e33npLbdu2VZEiRRzmV9x55505HhwAAACA21+WiopPPvlEkvTll19mFhQZGRmy2Ww6ePBgzkcHAAAAOJk7ndrVLLdUVOzevVs1atTQt99+6+x4cp3o6Gg917GD3nj7HdWqXefmD8jloqKiNPrN17QrfKc8PT3V4vFWenXwUHl5Zak+zXWsmve6Nas1Ytgg+fjkyVzW+JFHFTruXROjcj53Pd4VSxTUW09W1v13FVBSSrpW7j6p0GUHlJyarlY179Krze9XcX9fnbt4WR99e0SfbjmW+djvX39UdxeyKz397+drPv57Hf3rkusTcRK+z93jfX4z5G2tvOE6tzSnonv37pKk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EhMT9eeff2ru3LmSZKl5cnAuiops8PPzU2JiosOyq/fz5s1rRkhwgbi4OL388stauXKlFi5cqODgYLNDchlfX18VK1ZMgwcP1pYtW9z61+tZs2bJx8dHnTt3NjsUlypcuLDCwsLUvn172e123XnnnRo8eLA2b96suLg4s8NzGh8fH0nSyJEjlS9fPhUuXFj9+/fXDz/8oPj4eJOjc74dO3bo7Nmzat++vdmhuMSGDRu0bt06dezYUT4+PgoKClLfvn31+eefmx2aUxUoUECzZ8/WL7/8ooceekj9+/dX69atM9cBOYGiIhuCgoIUExOj8+fPZy6LiIhQ8eLFlT9/fhMjg7OcOHFC7dq1U1xcnJYsWWKJgmLPnj1q1qyZw1lRkpOT5e3t7dZDgpYvX66dO3eqZs2aqlmzplatWqVVq1apZs2aZofmVIcOHdJ7773nML46OTlZHh4emX94u6MyZcooPT1dKSkpmcuunhHHCmPN161bp5CQEPn5+ZkdikucPn36mjM9eXl5OQwLckfJyclKTU3VggULtGPHDi1evFgeHh4qU6aMW3+fw7UoKrKhVKlSqlGjhsaMGaO4uDhFRkZq+vTplvmlx2piY2P1/PPPq3r16po7d65lJioHBwcrKSlJEydOVHJysv7880+NHz9e7du3d+s/MteuXas9e/Zo165d2rVrlx5//HE9/vjjbn8WKH9/f4WFhWnOnDlKTU3VqVOn9O6776pNmzZufbwffPBBlShRQiNGjFB8fLyio6M1efJkPfroo5YYDrR7927VqlXL7DBcpn79+jp37pxmzpyptLQ0RUZGasaMGWrZsqXZoTndiy++qCVLligjI0P79+/XzJkz9fzzz5sdFtwIRUU2TZkyRampqXrkkUf01FNPqUGDBurTp4/ZYcEJli5dqlOnTmnNmjWqUaOGw3nd3VnevHk1Z84cHTlyRPXq1VPnzp314IMPuv2pdK2qePHimjVrlr799lvVrl1b7dq1U6VKlfT666+bHZpTeXt769NPP5Wnp6eaNm2qpk2bqnjx4hozZozZobnEyZMnVbRoUbPDcJkyZcpo1qxZ+u6771SnTh0999xzaty4sduf0dDHx0fTp0/X559/rurVq6t///7q3r27nnrqKbNDgxuxZVihvwsAAADAaehUAAAAADCEogIAAACAIRQVAAAAAAyhqAAAAABgCEUFAAAAAEMoKgAAAAAYQlEBAAAAwBCKCgAwybFjx8wOAQCAHEFRAcBtNW7cWJUqVcq8AnrVqlVVv359jR8/Xunp6Tm2n86dO2vq1KmSpNdff/2WrkL93Xff6cUXX8z2PpcuXarGjRtfd92OHTsUHByc7ecODg7Wjh07svXYqVOnqnPnztneNwAgd/IyOwAAcKa33npLbdu2zbx/+PBhdenSRXa7XS+//HKO7+/tt9++pe1iYmKUkZGR4/sHAMAMdCoAWEpwcLBq1aql3377TdKVLsOwYcP08MMP66GHHlJcXJxOnDihXr16qU6dOnr44Yc1efJkJScnZz7H4sWL9cgjj6hatWoaOnSoEhMTM9cNGzZMw4YNy7w/f/58hYSEqFq1amrbtq22bdumHTt26I033tCpU6dUrVo1nTlzRsnJyfrggw/0yCOPqHbt2urevbuOHz+e+TwRERHq3LmzqlWrppYtW2bGnx1nzpxR//791bhxY1WpUkWPPPKIlixZ4rDN1q1b9dhjj6lOnTp6+eWXde7cucx1Bw4cUOfOnVWrVi01adJE8+bNo0ACAIujqABgGSkpKdqxY4e2b9+uevXqZS7/6aeftGjRIq1YsUIeHh7q0qWLgoKCtHnzZn322Wf66aefMoc3bdu2TW+//bbeeecdhYeHq0qVKtq3b99197d06VJNnz5dEyZM0O7du/XMM8+od+/eCg4O1ltvvaU777xTe/fuVbFixTR58mR9//33mjdvnrZs2aIqVarohRde0OXLl5WSkqKePXsqKChI27dv16RJk7Rx48Zsvw6jRo2St7e3vvnmG+3Zs0fPPvusRo8erfj4+MxtfvjhB82ZM0fffvutUlJSNGjQIElXCpLnn39ezZo1008//aTp06frs88+0xdffJHteAAAuR9FBQC39tZbb6lmzZqqWbOm6tatq9GjR6tr16569tlnM7dp2LChihUrpgIFCuj7779XcnKyXn31VeXJk0d33HGHXnnlFYWFhUmSVqxYoSZNmqhu3bry8vJSx44dVb58+evue9myZerQoYOqVasmDw8PPfnkk/r444/l6+vrsF1GRoYWLVqkV199VSVKlFCePHnUt29fpaSk6Pvvv9fevXt1+vRpDRkyRHny5FFQUJC6du2a7dfknXfe0RtvvCFvb2+dOnVKefPmVVJSkmJjYzO3efnll3XXXXcpX758GjJkiLZv364zZ85oxYoVKl26tDp16iRvb2+VKVNGL774YubrAwCwJuZUAP/Xzt28pLaFYQB/dg4KauIHZaWWUBA06UuMIEqCRtmgwoF/QbMwCKGgJhJiRZSDoEyaBDUIwVFE0Kh5RRFERCKWH2glmaKyu4NL+7Y50YWz76R7nh8Iy9e1l746enQt6X9tYWFBdqbiK7W1tdI4Foshk8nAYrFItff3d5RKJaTTaSQSCbS3t8uuNxqNX66bSqXQ0NAgq3V1df0yL5PJ4O3tDVNTU6io+Oe7nlKphFgshmKxCLVaLQsjJpPp256+E41G4fP5cH9/j+bmZjQ1NQGA7PC6wWCQxh89JBIJxGIxXF1doaenR3pcFEWoVKrffj1ERPTzMVQQ0R9PEARprNfrYTKZcHh4KNVeX1+RTqeh0Wig1+sRjUZl18fjcbS2tv6ybn19PR4fH2W11dVVjI6OympqtRqVlZUIBoPo6OiQ6nd3d6irq8P19TUymQxyuRyqq6ul5/wdH1uppqen4XQ6IQgCLi8vEQ6HZfOSySTa2toAQOrXYDBAr9fDarVie3tbmvv09CTbOkVERH8ebn8iIvrEZrMhl8shEAigWCwim83C7XbD5XJBEASMj4/j+PgYJycnKJfLCIVCOD8//3KtsbEx7O/v4+LiAqIo4uDgALu7u1KIyOfzKJfLqKiowMTEBFZWVhCPxyGKIkKhEEZGRhCJRNDZ2Qmz2QyPx4N8Po9IJIJgMPivvcTjcdktmUyiVCqhUCigqqoKgiDg4eEBS0tLAP4OHB/8fj8SiQReXl7g9XoxPDwMjUYDu92Os7MzhMNhlMtlJJNJTE5Owuv1/jcfABER/Uj8pYKI6JOamhrs7OzA6/UiEAhAFEVYrVZsbGwAALq7u+Hz+eD1euFyudDb2ys79P2Z3W5HNpvFzMwMUqkUWlpasLW1BY1GA4vFAq1WC4vFgr29Pbjdbvj9fjidTjw/P8NoNGJ9fV06r7G5uYn5+Xn09fVBp9NhaGgIR0dH3/YyMDAgu6/T6XB6eorFxUWsra3B4/FAq9XC4XDg9vYWNzc3MJvNAID+/n44HA4UCgXYbDbMzs4CABobGxEIBLC8vAyPxwOVSoXBwUHMzc0pet+JiOhnE975P4BERERERKQAtz8REREREZEiDBVERERERKQIQwURERERESnCUEFERERERIowVBARERERkSIMFUREREREpAhDBRERERERKcJQQUREREREijBUEBERERGRIgwVRERERESkCEMFEREREREp8hfbfx1NfH432AAAAABJRU5ErkJggg=="
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 绘制混淆矩阵热力图\n",
    "plt.figure(figsize=(10, 8))\n",
    "sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues')\n",
    "plt.title(\"CNN - Confusion Matrix (MNIST)\")\n",
    "plt.xlabel(\"Predicted Label\")\n",
    "plt.ylabel(\"True Label\")\n",
    "plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-06-10T12:57:21.247444Z",
     "start_time": "2025-06-10T12:57:20.750164Z"
    }
   },
   "id": "c1d65aa6122dab57",
   "execution_count": 10
  },
  {
   "cell_type": "code",
   "outputs": [],
   "source": [],
   "metadata": {
    "collapsed": false
   },
   "id": "beb382b057a93bd"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
